﻿/*****************************************************************//**
 * @file    PickedDataCalculator.h
 * @brief   拾取数据计算工具。
 *  
 * @author  ChengHaotian (yeguangbaozi@foxmail.com)
 * @date    2024-10-31
 *********************************************************************/

#ifndef __PICKEDDATACALCULATOR_H__
#define __PICKEDDATACALCULATOR_H__

#include <QObject>

#include "PickDataProviderAPI.h"

// GUI
#include "GUIPickInfo.h"

// 前置声明
class vtkCell;
class vtkIdList;
class vtkIntArray;
class vtkDataSet;
class vtkUnstructuredGrid;

namespace AppFrame
{
    class FITKKeyMouseStates;
}

namespace GraphData
{
    class PickedData;
}

namespace GraphData
{
    /**
     * @brief   拾取数据计算工具类。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-10-31
     */
    class PICKDATAPROVIDERAPI PickedDataCalculator : public QObject
    {
        Q_OBJECT
    public:
        /**
         * @brief   构造函数。
         * @param   pickedInfo：拾取信息
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        PickedDataCalculator(GraphData::PickedData *pickedInfo);

        /**
         * @brief   析构函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        ~PickedDataCalculator() = default;

        /**
         * @brief   根据拾取类型与相关信息进行计算，获取实际需要高亮数据。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        void calculate();

    private:
        /**
         * @brief   获取拾取到的演员数据集。
         * @return  VTK数据集
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-18
         */
        vtkDataSet* getPickedDataSet();

        /**
         * @brief   单独拾取模式数据生成。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-01
         */
        void bySingle();

        /**
         * @brief   单独拾取合并可视化对象中的部分数据。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-22
         */
        void byMergedObject();
        
        /**
         * @brief   单独拾取合并SEA子系统可视化对象中的部分数据。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-18
         */
        void byMergedObjectSEASubSys();
        /**
         * @brief    单独拾取合并FE子系统可视化对象中的部分数据。
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-01-09
         */
        void byMergedObjectFESubSys();
        /**
         * @brief    单独拾取载荷
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-25
         */
        void bySingleLoad();
        /**
         * @brief    单独拾取传感器
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-12-25
         */
        void bySingleSensor();

        /**
         * @brief   框选拾取模式数据生成。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-01
         */
        void byAreaPick();

        /**
         * @brief   拾取SEA节点。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-01
         */
        void byDiscNodes();

        /**
         * @brief   单个拾取几何。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-01
         */
        void bySingleGeometry();

        /**
         * @brief   单个拾取网格单元。
         * @param   cellDim：网格维度（-1则不进行筛选）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-01
         */
        void bySingleMeshCell(int cellDim = -1);

        /**
         * @brief   单个拾取SEA梁子系统。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-22
         */
        void bySingleSEABeam();

        /**
         * @brief   框选拾取几何。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-05
         */
        void byAreaGeometry();

        /**
         * @brief   框选拾取网格单元。
         * @param   cellDim：网格维度（-1则不进行筛选）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-02
         */
        void byAreaMeshCell(int cellDim = -1);

        /**
         * @brief   根据网格单元属性拾取区域。
         * @param   cellDim：网格维度（-1则不进行筛选）[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-05
         */
        void byPropMeshCell(int cellDim = -1);

    private:
        /**
         * @brief   键盘状态监视器。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-01
         */
        AppFrame::FITKKeyMouseStates* m_keyStates{ nullptr };

        /**
         * @brief   需要计算的拾取数据。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        GraphData::PickedData* m_pickedData{ nullptr };

    };
}

#endif // __PICKEDDATACALCULATOR_H__
